package cn.xiaolang.function.design_pattern.dynamic.proxy.pattern.cglib;

import lombok.extern.slf4j.Slf4j;
import net.sf.cglib.proxy.Enhancer;
import net.sf.cglib.proxy.MethodInterceptor;
import net.sf.cglib.proxy.MethodProxy;

import java.lang.reflect.Method;

/**
 * cglib动态代理（动态生成代理类的子类，需要导入：cglib-nodep-2.1_3.jar包）
 *
 * @author DeanKano
 * @date 2016年4月19日
 */
@Slf4j
public class CglibProxyFactory implements MethodInterceptor {

    private Enhancer enhancer = new Enhancer();

    public Object getProxyInstance(Class<?> clazz) {
        //设置要创建的子类
        enhancer.setSuperclass(clazz);
        //通过字节码技术动态生成代理类的子类实例
        enhancer.setCallback(this);
        return enhancer.create();
    }

    @Override
    public Object intercept(Object object, Method method, Object[] args, MethodProxy proxy) throws Throwable {
        log.info("前置增强：{}", method.getName());
        //调用父类反射代理对象的方法
        Object result = proxy.invokeSuper(object, args);
        log.info("后置增强：{}", method.getName());
        return result;
    }

}
